Source file: /~heha/hs/inpout32-hs.zip/Redir.h

#pragma once

#ifdef _M_IX86
#include <setupapi.h>
#include <cfgmgr32.h>
EXTERN_C{
#include <hidsdi.h>
}

extern struct _setupapi{
 HMODULE hLib;
 BOOL (WINAPI*EnumDeviceInterfaces)(HDEVINFO,PSP_DEVINFO_DATA,LPCGUID,DWORD,PSP_DEVICE_INTERFACE_DATA);
 BOOL (WINAPI*GetDeviceInterfaceDetail)(HDEVINFO,PSP_DEVICE_INTERFACE_DATA,PSP_DEVICE_INTERFACE_DETAIL_DATA,DWORD,PDWORD,PSP_DEVINFO_DATA);
}setupapi;
extern const char setupapi_names[];

extern struct _hid{
 HMODULE hLib;
 void (WINAPI*GetHidGuid)(LPGUID);
 BOOLEAN (WINAPI*GetPreparsedData)(HANDLE,PHIDP_PREPARSED_DATA*);
 BOOLEAN (WINAPI*GetFeature)(HANDLE,PVOID,ULONG);
 BOOLEAN (WINAPI*SetFeature)(HANDLE,PCVOID,ULONG);
 BOOLEAN (WINAPI*GetAttributes)(HANDLE,PHIDD_ATTRIBUTES);
 NTSTATUS (WINAPI*GetCaps)(PHIDP_PREPARSED_DATA,PHIDP_CAPS);
}hid;
extern const char hid_names[];

extern struct _krnl{
 HINSTANCE hLib;
 HANDLE (WINAPI*CreateRemoteThread)(HANDLE,LPSECURITY_ATTRIBUTES,SIZE_T,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD);
 HANDLE (WINAPI*OpenThread)(DWORD,BOOL,DWORD);
 BOOL (WINAPI*CancelIo)(HANDLE);
 PVOID (WINAPI*AddVectoredExceptionHandler)(BOOL,LONG(WINAPI*)(PEXCEPTION_POINTERS));
 ULONG (WINAPI*RemoveVectoredExceptionHandler)(LONG(WINAPI*)(PEXCEPTION_POINTERS));
 BOOL (WINAPI*IsWow64Process)(HANDLE,PBOOL);
 BOOL (WINAPI*Wow64Disable)(PVOID*);
 BOOL (WINAPI*Wow64Revert)(PVOID);
}krnl;
extern const char krnl_names[];

#define SetupDi(x) setupapi.x
#define HidD_(x) hid.x
#define HidP_(x) hid.x
#define KRNL(x) krnl.x

/* The first parameter gets an instance handle of the DLL of the first string,
 * followed by more or less function pointers to functions inside this DLL,
 * defined by the strings that follow the first string.
 * The second IN parameter is a double-zero-terminated ASCII string list.
 * The first is the DLL name (.dll can be omitted),
 * all others are import names.
 * On call for given HMODULE, returns false if one of entries is not available
 * HMODULE gets -1 on LoadLibraryA() failure.
 * The caller may set HMODULE manually, and then load the function pointers only.
 * In this case, the first string of the second parameter will be ignored.
 */
bool _fastcall dynaload(HMODULE&,const char*);
extern long sysver;
extern HINSTANCE hInstance;

void InstallVdmHook();
void VddInit();
void VddDone();

#else

#define SetupDi(x) SetupDi##x
#define HidD_(x) HidD_##x
#define HidP_(x) HidP_##x
#define KRNL(x) x
#define dynaload(a,b) TRUE
#define sysver 5
#define InstallVdmHook() (void)0
#define VddInit() (void)0
#define VddDone() (void)0

#endif

void InitRedirector(void);
void patch(WORD &addr);
int setstarttype(int starttype);

/*****************************************************
 ** LPT access redirector, for USB->PRN and USB2LPT **
 *****************************************************/

bool RedirOut(WORD addr, BYTE data);
bool RedirIn(WORD addr, BYTE &data);

#define elemof(x) (sizeof(x)/sizeof(*(x)))
#define T(x) TEXT(x)

struct REDIR{
 BYTE where;	// 0 = free, 1 = true LPT port, 2 = USB2LPT native, 3 = USB2LPT HID, 4 = USB->PRN
 union{
  DWORD addr;	// address (ECP/EPP)
  LPTSTR name;	// USB device name (crypitc, strdup() generated)
 };
};

extern REDIR RedirInfo[9];	// 0..2: Automatic, for standard addresses, 3..9: Via LptOpen()
extern WORD SppDef[3];
Detected encoding: ASCII (7 bit)2